#include <iostream>
#include <string>
#include <websocketpp/server.hpp>
#include <websocketpp/config/asio_no_tls.hpp>

typedef websocketpp::server<websocketpp::config::asio> wsserver_t;
//http回调函数

void Print(const std::string &str)
{
    std::cout<<str<<std::endl;
}

void http_callback(wsserver_t *srv,websocketpp::connection_hdl hdl)
{
    //给客户端返回一个helloworld的页面
    wsserver_t::connection_ptr conn = srv->get_con_from_hdl(hdl);
    std::cout<<conn->get_request_body()<<std::endl;
    websocketpp::http::parser::request req=conn->get_request();
    std::cout<<"method:"<<req.get_method()<<std::endl;
    std::cout<<"uri:"<<req.get_uri()<<std::endl;
    
    std::string body = "<html><body><h1>Hello World!</h1></body></html>";
    conn->set_body(body);
    conn->append_header("Content-Type", "text/html");
    conn->set_status(websocketpp::http::status_code::ok);
    wsserver_t::timer_ptr tp = srv->set_timer(5000, std::bind(Print, "bitejiuyeke"));
    tp->cancel();//定时任务的取消，会导致定时任务立即被执行
}
//websocket打开回调函数
void wsopen_callback(wsserver_t *srv,websocketpp::connection_hdl hdl)
{
    std::cout<<"websocket握手成功"<<std::endl;
}
//关闭回调函数
void wsclose_callback(wsserver_t *srv, websocketpp::connection_hdl hdl)
{
    std::cout<<"websocket连接关闭"<<std::endl;
}
//消息回调函数
void wsmsg_callback(wsserver_t *srv, websocketpp::connection_hdl hdl, wsserver_t::message_ptr msg)
{
    wsserver_t::connection_ptr conn = srv->get_con_from_hdl(hdl);
    std::cout<<"wsmg:"<<msg->get_payload()<<std::endl;
    std::string rsp="client say:"+msg->get_payload();
    conn->send(rsp,websocketpp::frame::opcode::text);
}

int main()
{ 
    //1.创建服务器对象
    wsserver_t wssrv;
    //2.设置日志等级
    wssrv.set_access_channels(websocketpp::log::alevel::all);
    //3.初始化asio调度器
    wssrv.init_asio();
    wssrv.set_reuse_addr(true);
    //4.设置回调函数
    wssrv.set_http_handler(std::bind(http_callback, &wssrv, std::placeholders::_1));
    wssrv.set_open_handler(std::bind(wsopen_callback, &wssrv, std::placeholders::_1));
    wssrv.set_close_handler(std::bind(wsclose_callback, &wssrv, std::placeholders::_1));
    wssrv.set_message_handler(std::bind(wsmsg_callback, &wssrv, std::placeholders::_1, std::placeholders::_2));
    //5.设置监听端口
    wssrv.listen(8085);
    //6.启动服务器
    wssrv.start_accept();
    //7.运行asio事件循环
    wssrv.run();
    
}